home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / c / tsr4c.zip / ASC.C next >
Text File  |  1994-02-02  |  6KB  |  305 lines

  1. /********************************************************************
  2.         PopASC  (c) Copyright 1992-94 by Omega Point, Inc.
  3. *********************************************************************/
  4.  
  5.  
  6. #include "cr.h"
  7.  
  8.  
  9. /***********************************************************
  10.     RESIDENT VARIABLES & DEFINITIONS
  11. ************************************************************/
  12.  
  13. extern word _hkey_again; /* Set to NZ if another hot-key hit. */
  14.  
  15. #define MOVABLE_WINDOW (0)    /* Set to 1 if window movable */
  16. #define DX1 (7)
  17. #define DY (18)
  18. #define NC (4)
  19. #define DX (NC*DX1+1)
  20. #define DXC (4*8+2)
  21. #define BLK_SZ (DXC*DY)
  22. #define MAX_PG (16)
  23.  
  24. word saved_scr[BLK_SZ];    /* Keep foreground screen here */
  25.  
  26. int x0=16,y0=4;        /* Box position */
  27. int sdx=DX,sdy=DY;
  28. int cur_page;
  29. int sel_let,sel_x=0,sel_y=0;
  30. int pref_let='P'-0x40;
  31. int max_x,max_y;
  32. char pref_on=0,color_chart=0;
  33.  
  34. byte atr_fram=0x19,atr_dec=0x1b,atr_hex=0x1b,sel_atr=0x4e;
  35. byte atr_txt[]={0x1e,0x1f};
  36.  
  37. /* Last ASCII page - graphics characters in logical order */
  38.  
  39. byte gc[64]={\
  40. g1_c1,g1_t4,g1_c4, g2_c1,g2_t4,g2_c4, g21_c1,g21_t4,g21_c4, g12_c1,g12_t4,g12_c4,
  41. 0xfe,0xb0,0x07,0xf9,
  42. g1_t1,g1_cr,g1_t3, g2_t1,g2_cr,g2_t3, g21_t1,g21_cr,g21_t3, g12_t1,g12_cr,g12_t3,
  43. 0x16,0xb1,0x04,0xdc,
  44. g1_c2,g1_t2,g1_c3, g2_c2,g2_t2,g2_c3, g21_c2,g21_t2,g21_c3, g12_c2,g12_t2,g12_c3,
  45. 0xae,0xb2,0xf0,0xdf,
  46. g1_ver,g1_hor,g2_ver,g2_hor, 0x11,0x10,0x1e,0x1f, 0x1b,0x1a,0x18,0x19,
  47. 0xaf,0xdd,0xde,0xdb};
  48.  
  49. #define TOP_FR (0xdb)
  50. #define BOT_FR (0xdb)
  51.  
  52. char tmp[5]="1234";
  53.  
  54. send_key()
  55. {
  56.   if (pref_on)
  57.     stuff_key(pref_let);
  58.     stuff_key(sel_let);
  59. }
  60.  
  61. /* Show COLOR CHART */
  62.  
  63. show_colors()
  64. { register char *s=tmp+1;
  65.   int m,i,j,xs;
  66.     *((dword*)tmp)=0x20202020L; m=0;
  67.     xs=x0-4+1;
  68.     for (j=0; j<8; j++)
  69.       {
  70.       xs+= 4; crs_y=y0;
  71.       for (i=0; i<16; i++,m++)
  72.     {
  73.         crs_x=xs; crs_y++;
  74.     vid_atr=m;
  75.     b2hex(m,s); dsp(s-1);
  76.     }
  77.       }
  78. }
  79.  
  80. show_sel()
  81. { int i;
  82.   crs_x=sel_x*DX1+x0+4;
  83.   crs_y=sel_y+y0+1;
  84.   hor_atr(3);
  85.   i=((sel_x<<4)|sel_y)&0xff;
  86.   if (cur_page==MAX_PG) sel_let=gc[i];
  87.     else sel_let=(cur_page<<4)|i;
  88. }
  89.  
  90. mov_sel(dx,dy)
  91. {
  92.    if (color_chart) return;
  93.    vid_atr=atr_txt[sel_x&1];
  94.    show_sel();
  95.    sel_x+=dx; 
  96.    if (sel_x>=NC) sel_x=0;
  97.     else if (sel_x<0) sel_x=NC-1;
  98.    sel_y+=dy;
  99.    if (sel_y>=16) sel_y=0;
  100.     else if (sel_y<0) sel_y=15;
  101. }
  102.  
  103. show_frame()
  104. { int i,j;
  105.    crs_x=x0; crs_y=y0;
  106.    vid_atr=atr_fram;
  107.  
  108.    if (color_chart)
  109.      {
  110.      dsp_box(DXC,DY,'█');
  111.      return;
  112.      }
  113.  
  114.    dsp_hor(TOP_FR,DX);
  115.    for (i=0,crs_y++,crs_x=x0; i<16;i++)
  116.      {
  117.      dsp("▌");
  118.      for (j=0; j<NC; j++) dsp("  │   │");
  119.      crs_x--;dsp("▐"); 
  120.      crs_x=x0; crs_y++;
  121.      }
  122.    dsp_hor(BOT_FR,DX);
  123.  
  124.  }
  125.  
  126. /*** SHOW ASCII CHART ***/
  127.  
  128. show_page()
  129. {
  130.   int i,c,j,n1,n0,m,xs=x0+1,gr=0;
  131.   register char *s=tmp;
  132.  
  133.      if (cur_page>MAX_PG) cur_page=0;
  134.     else if (cur_page<0) cur_page=MAX_PG;
  135.  
  136.      if (cur_page<MAX_PG) m=(cur_page/NC)*NC;
  137.     else {m=0; gr=1;}
  138.  
  139.      if (color_chart)
  140.     {
  141.     show_colors();
  142.     return;
  143.     }
  144.  
  145.      for (j=0; j<NC; j++)
  146.        {
  147.        n0=((m+j)<<4);
  148.        n1=n0+16;
  149.        crs_y=y0+1;
  150.        for (i=n0; i<n1; i++)
  151.      {
  152.      crs_x=xs; vid_atr=atr_hex;
  153.      c = gr ? gc[i]:i;
  154.      b2hex(c,(char*)s); s[2]=0; dsp((char*)s);
  155.      crs_x+=2;
  156.      vid_atr=atr_txt[i&1];
  157.      dsp_chr(c); crs_y++;
  158.      }
  159.        xs+=DX1;
  160.        }
  161. }
  162.  
  163. #if MOVABLE_WINDOW
  164. move_pg(x1,y1)
  165. {
  166.     crs_x=x0; crs_y=y0;
  167.     put_blk(sdx,sdy,saved_scr);
  168.     crs_x=x1; crs_y=y1;
  169.     get_blk(sdx,sdy,saved_scr);
  170.     x0=x1; y0=y1;
  171.     show_frame();
  172.     show_page();
  173. }
  174. #endif
  175.  
  176.  
  177. tog_col_chart()
  178. {
  179.   crs_x=x0; crs_y=y0;
  180.   put_blk(sdx,sdy,saved_scr);
  181.   color_chart^=1;
  182.   if (! color_chart)
  183.     {
  184.     sdx=DX; sdy=DY;
  185.     }
  186.   else
  187.     {
  188.     sdx=DXC; sdy=DY;
  189.     }
  190.   set_max_xy();
  191.   crs_x=x0; crs_y=y0;
  192.   get_blk(sdx,sdy,saved_scr);
  193.   show_frame();
  194. }
  195.  
  196. full_key()
  197. { word k;
  198.      while (!  anykey())
  199.     if (_hkey_again)
  200.       {
  201.       _hkey_again=0;
  202.       return(-1);
  203.       }
  204.       k=pckey(); 
  205.       if (k<K_NUMPAD)
  206.         if (k&0xff) 
  207.       {
  208.       k&=0xff;
  209.       if (k>='a')
  210.         if (k<='z') k-=0x20;
  211.       }
  212.       return(k);
  213. }
  214.  
  215. set_max_xy()
  216. {
  217.    max_x=scr_width-sdx;
  218.    max_y=scr_len-sdy;
  219.    if (x0>max_x) x0=max_x;
  220.    if (y0>max_y) y0=max_y;
  221. }
  222.  
  223. show_chart()
  224. {  word k;
  225.  
  226.    show_frame(); /* Show ASCII chart frame & titles */   
  227.  
  228.    while (1) {
  229.  
  230.       show_page();    /* Show current page */
  231.       if (!color_chart)
  232.     {
  233.         vid_atr=sel_atr;
  234.         show_sel();
  235.     }
  236.       k=full_key();     
  237.       switch (k) {
  238.     case K_PGUP:    cur_page-=NC; break;
  239.     case K_PGDN:    cur_page+=NC; break;
  240.     case K_UP:    mov_sel(0,-1);break;
  241.     case K_DN:    mov_sel(0,+1);break;
  242.     case K_LEFT:    mov_sel(-1,0);break;
  243.     case K_RIGHT:    mov_sel(+1,0);break;
  244.     case K_HOME:    mov_sel(0,-3);break;
  245.     case K_END:    mov_sel(0,+3);break;
  246.  
  247. /* -- Makes box movable with Shift-Cursor keys --*/
  248.  
  249. #if    MOVABLE_WINDOW
  250.  
  251.     case SK_UP:    move_pg(x0,y0>0?y0-1:max_y);
  252.             break;
  253.     case SK_DN:    move_pg(x0,y0<max_y?y0+1:0);
  254.             break;
  255.     case SK_LEFT:    move_pg(x0>0?x0-1:max_x,y0);
  256.             break;
  257.     case SK_RIGHT:    move_pg(x0<max_x?x0+1:0,y0);
  258.             break;
  259. #endif
  260.  
  261.     case 0x20:    tog_col_chart();
  262.             break;
  263.     case K_INS:    pref_on=1;send_key();
  264.             return;
  265.     case 0xd:    pref_on=0;
  266.             send_key();
  267.     case -1:
  268.     case 0x1B:    return;
  269.       }
  270.    }
  271. }
  272.  
  273. /** Save/Restore foreground screen **/
  274.  
  275. chg_scr(func)
  276. fp func;
  277. {
  278.    crs_x=x0; crs_y=y0;
  279.    (*func)(sdx,sdy,saved_scr);
  280.  
  281. }
  282.  
  283. /** RESIDENT CODE HOT-KEY LIST **/
  284.  
  285. word hk_list[]={K_RC,M_LC+0x39,SC_F12,M_LA+0x34,0};
  286.  
  287. /***********************************************************
  288.     MAIN INTERRUPT SERVICE FUNCTION FOR HOT-KEYS
  289. ************************************************************/
  290.  
  291. isr(hk)
  292. {
  293.    if ((hk==hk_list[2])||(hk==hk_list[3])) send_key();
  294.    else
  295.      {
  296.      _hkey_again=0;    /* Re-enable sensing of hot-key from within */
  297.      chk_video();    /* Obtain screen width, cursor pos */
  298.      set_max_xy();    /* Calculate box movement boundaries */
  299.      chg_scr(get_blk);  /* Save foreground screen */
  300.      show_chart();    /* Go display ASCII/Color chart */
  301.      chg_scr(put_blk);    /* Restore foreground screen */
  302.      }
  303. }
  304.  
  305.